Skip to main content

静态编译 反射 动态执行 之坑

go在宿主机编译,会把宿主机的环境变量编译进去。

我宿主机的hosts里的地址指向的是本地。如果放在容器里面,容器指的地址肯定是另外一个容器。go编译的结果是我本地指向的地址,在容器内运行的时候就无法访问到另一个容器。

/**
* @Title 请填写文件名称
* @Description 请填写文件描述
* @Author will 2020/7/13 14:55
* @Update will 2020/7/13 14:55
*/
package models

import (
_ "github.com/go-sql-driver/mysql"
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/mysql"
"log"
)

var Db *gorm.DB

func init() {
var err error
Db, err = gorm.Open("mysql", "root:root@(192.168.3.9:3306)/video_video?charset=utf8&parseTime=True&loc=Local")
if err != nil {
log.Panicln("errDesc:", err.Error())
}else {
log.Println("mysql已链接")
}
}

尝试了反射 没成功

/**
* @Title 请填写文件名称
* @Description 请填写文件描述
* @Author will 2020/7/13 14:55
* @Update will 2020/7/13 14:55
*/
package models

import (
"fmt"
_ "github.com/go-sql-driver/mysql"
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/mysql"
"log"
"net"
"reflect"
"time"
)

var Db *gorm.DB

func init() {

//获取ip地址
host, err := net.Dial("ip:icmp", "video_video")
if err != nil {
fmt.Println(err)
return
}
ip := host.RemoteAddr()
fmt.Println("---", ip.String())



//生成链接
var link string =""
sqlLink := reflect.ValueOf(&link)
newSqlLink :=sqlLink.Elem()
newSqlLink.SetString(fmt.Sprintf("root:root@tcp(%s:3306)/video_video?charset=utf8&parseTime=True&loc=Local",ip.String()))
fmt.Println("~~~",newSqlLink)

//使用反射调用方法。
//Db, err = gorm.Open("mysql", mysqlLink)
time.Sleep(1*time.Second)

f1 := gorm.Open
refGorm:=reflect.ValueOf(f1)
//refGorm.MethodByName("Open")
fmt.Printf("kind:%s,type :%s \n",refGorm.Kind(),refGorm.Type())
//mysqlLink := fmt.Sprintf("root:root@tcp(%s:3309)/video_video?charset=utf8&parseTime=True&loc=Local",ip.String())
//mm:= refGorm.Call([]reflect.Value{reflect.ValueOf("mysql"),reflect.ValueOf(mysqlLink)})
mm:= refGorm.Call([]reflect.Value{reflect.ValueOf("mysql"),reflect.ValueOf(newSqlLink)})
fmt.Printf("m1 kind:%s,type :%s \n",mm[0].Kind(),mm[0].Type())
fmt.Printf("m2 kind:%s,type :%s \n",mm[1].Kind(),mm[1].Type())

Db = mm[0].Interface().(*gorm.DB)
//err = mm[1].Interface().(error)

fmt.Println("--------",mm[0],mm[0].Interface().(*gorm.DB))

if err != nil {
log.Panicln("errDesc:", err.Error())
}else {
log.Println("mysql已链接")
}
}

以为是获取ip时候没用反射的问题,修正后,依然不行。 编译的时候还是显示的主机的ip

package models

import (
"fmt"
_ "github.com/go-sql-driver/mysql"
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/mysql"
"log"
"net"
"reflect"
"time"
)

var Db *gorm.DB

func init() {

//使用反射获取ip地址
f2 := net.Dial
value2 := reflect.ValueOf(f2)
mm2 := value2.Call([]reflect.Value{reflect.ValueOf("ip:icmp"),reflect.ValueOf("video_video")})
fmt.Println(mm2[0],mm2[1])
if mm2[1].Interface() != nil{
panic("检测ip时候出错啦")
}
host := mm2[0].Interface().(net.Conn)
//ip := host.RemoteAddr()
fmt.Println("---", host.RemoteAddr().String())



//生成链接
var link string =""
sqlLink := reflect.ValueOf(&link)
newSqlLink :=sqlLink.Elem()
newSqlLink.SetString(fmt.Sprintf("root:root@tcp(%s:3306)/video_video?charset=utf8&parseTime=True&loc=Local",host.RemoteAddr().String()))
fmt.Println("~~~",newSqlLink)

//使用反射调用方法。
//Db, err = gorm.Open("mysql", mysqlLink)
time.Sleep(1*time.Second)

f1 := gorm.Open
refGorm:=reflect.ValueOf(f1)
//refGorm.MethodByName("Open")
fmt.Printf("kind:%s,type :%s \n",refGorm.Kind(),refGorm.Type())
//mysqlLink := fmt.Sprintf("root:root@tcp(%s:3309)/video_video?charset=utf8&parseTime=True&loc=Local",host.RemoteAddr().String())
//mm:= refGorm.Call([]reflect.Value{reflect.ValueOf("mysql"),reflect.ValueOf(mysqlLink)})
mm:= refGorm.Call([]reflect.Value{reflect.ValueOf("mysql"),reflect.ValueOf(newSqlLink)})
fmt.Printf("m1 kind:%s,type :%s \n",mm[0].Kind(),mm[0].Type())
fmt.Printf("m2 kind:%s,type :%s \n",mm[1].Kind(),mm[1].Type())

Db = mm[0].Interface().(*gorm.DB)
fmt.Println("--------",mm[0],mm[0].Interface().(*gorm.DB))

if mm[1].Interface() != nil {
err := mm[1].Interface().(error)
log.Panicln("errDesc:", err.Error())
}else {
log.Println("mysql已链接")
}
}

确认 window 上反射不是动态编译的。也不是后执行的。